package com.mccken.rapid.core.context;

import java.util.function.Consumer;

import io.netty.channel.ChannelHandlerContext;

/**
 * 网关上下文接口定义
 */
public interface Context {
	
	// 一个请求正在执行过程中
	int RUNNING = -1;
	
	//  写回响应标记，标记当前Context/请求需要写回
	int WRITTEN = 0;
	
	// 当写回成功后，设置该标记: ctx.writeAndFlush(response)
	int COMPLETED = 1;
	
	// 表示整个网关请求完毕，彻底结束
	int TERMINATED = 2;
	
	/*********************************** 设置网关的状态系 ***********************************************/
	
	// 设置上下文状态为正常运行状态
	void runned();
	
	// 设置上下文状态为标记写回
	void writtened();
	
	// 设置上下文状态为写回完成
	void completed();
	
	// 设置上下文状态为最终结束
	void terminated();

	/*********************************** 判断网关的状态系 ***********************************************/
	boolean isRunning();
	
	boolean isWrittended();
	
	boolean isCompleted();
	
	boolean isTerminated();
	
	// 协议 
	String getProtocol();
	
	// todo 定义规则
	Object getRule();
	
	// 获取请求对象 
	Object getRequest();
	
	Object getResponse();
	
	void setResponse(Object response);
	
	void setThrowable(Throwable throwable);
	
	Throwable getThrowable();
	
	
	// todo 定义 上下文AttributeKey对象
	// 获取上下文参数
	<T> T getAttribute(AttributeKey<T> key);

	<T> T putAttribute(AttributeKey<T> key, T value);
	
	// 获取netty的上下文
	ChannelHandlerContext getNettyCtx();
	
	// 是否保持连接
	boolean isKeepALive();
	
	// 标记资源是否释放
	void releaseRequest();
	
	// 写回接收回调函数设置
	void completedCallback(Consumer<Context> consumer);
	
	// 回调函数执行
	void invokeCompletedCallback();
}
